#ifndef CPP_CANVAS_H
#define CPP_CANVAS_H

#include <widget/View.h>
#include <vector>
#include <Point.h>

class Paint;
class Bitmap;
class Font;
class Rect;
class Activity;

//@brief 画布
//@author cvte
//@description 用于基础内容的绘制
class Canvas {
   public:
    Canvas();
    //@method 创建空画布，如果hdc为nullptr，那么会new一个DC出来（CreateCompatibleDCEx），新创建的DC会在析构时释放; 如果背景是视频，请设置isVideoBackground为true
    Canvas(int width, int height, HDC hdc, bool isOnVideoBackground);
    ~Canvas();
    void setPaintHWND(HWND hWnd);
    void setPaintHDC(HDC hdc);
    HDC getPaintHDC(void);
    void setSize(int width, int height);
    int getWidth();
    int getHeight();
    HDC beginPaint();
    void endPaint();
    void setBkMode(int mode);

    //@method 绘制位图
    void drawBitmap(int x, int y, int w, int h, Bitmap& bitmap);
    void drawBitmap(int x, int y, Bitmap& bitmap);
    void drawBitmap(Rect rect, Bitmap& bitmap);
    //@method 绘制填充矩形
    void fillRect(int x, int y, int w, int h, int color);
    void fillRect(Rect& rect, int color);
    //@method 绘制文本
    void drawText(Font& font, unsigned int color, Rect& rect, TextAlignStyle style, const char* text);
    //@method 绘制文本
    void drawText(const char* text, int x, int y, Paint p);
    //@method 绘制矩形
    void drawRect(int x, int y, int w, int h, int color);
    //@method 绘制圆形
    void drawCircle(int cx, int cy, int radius, Paint p);
    //@method 绘制圆弧
    void drawArc(int cx, int cy, int radius, int angle, Paint p);
    void fillArc(int x, int y, int width, int height, int ang1, int ang2, int color);
    //@method 绘制圆角矩形
    void fillRoundRect(int x, int y, int width, int height, int round, int color);
    //@method 设置透明色，即某个颜色在此Canvs上是透明的
    void setColorToTransparent(int color);

    //@method 设置行距
    void setLineSpacingExtra(int px);
    //@method 获取行距
    int getLineSpacingExtra();

    //@method 从别的Canvas中拷贝内容到此Canvas
    void drawFromCanvas(int dx, int dy, Canvas& srcCanvas, Rect rect);
    //@method 从别的HDC中拷贝内容到此Canvas的HDC
    void drawFromHDC(int dx, int dy, HDC srcHDC, int dcW, int dcH, Rect srcRect);

    //@method 清空区域内容
    void cleanContent(Rect& rect);

    void save();
    void restore();
    //把画布的平移dx, dy进行绘制
    void translate(int dx, int dy);

    //@method 根据文本长度、每行的宽度和行距计算文本高度
    static int CalTextHeight(const char* text, int width, Font& font, int lineSpacingExtra);
    //@method 计算单行文本的宽度
    static int CalTextWidth(const char* text, Font& font);

    //@method 将Canvas的内容保存在Bitmap
    void canvasToBitmap(Bitmap& bitmap);
    //@method 将控件中的内容保存到Bitmap
    static void viewToBitmap(View& view, Bitmap& bitmap);
    //@method 将控件中的内容绘制到Bitmap
    static void viewDrawToBitmap(View& view, Bitmap& bitmap);
    //@method 将屏幕内容保存到Bitmap
    static void screenToBitmap(int x, int y, int w, int h, Bitmap& bitmap);
    //@method 将Activity内容保存到Bitmap, 如果activity为nullptr，则获取最上面的activity
    static void activityToBitmap(Activity* activity, Bitmap& bitmap);
    //@method 开启关闭HWND的绘制，可用于保持当前控件画面不刷新
    static void enableHwndPaint(HWND hWnd, bool enable);
    //@method 直接在HDC_SCREEN上绘制矩形
    static void fillRectToScreen(int x, int y, int w, int h, int color);
    //@method 将图片直接画到HDC_SCREEN上，要先关闭双缓冲，目前用于过场动画帧的绘制
    static void drawBitmapToScreen(int x, int y, int w, int h, Bitmap& bitmap);
    //@method 将图片部分区域直接画到HDC_SCREEN上，要先关闭双缓冲，目前用于过场动画帧的绘制
    static void drawBitmapPartToScreen(int x, int y, int w, int h, Bitmap& bitmap, int bitmapX, int bitmapY, int bitmapWidth, int bitmapHeight);

   private:
    HWND mHwnd;
    HDC mHdc;

    int mX = 0;
    int mY = 0;
    int mWidth = 0;
    int mHeight = 0;
    int mLineSpacingExtra = 10;
    bool mIsNewDC = false;

    std::vector<Point> mPointVec;
};

#endif /* CPP_CANVAS_H */